package org.jeecg.modules.wmhb.service;

import org.jeecg.common.system.vo.SelectTreeModel;
import org.jeecg.modules.wmhb.entity.*;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.common.exception.JeecgBootException;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.jeecg.modules.wmhb.vo.WmDepartRemainTaskVo;
import org.jeecg.modules.wmhb.vo.WmProjectStatisticVo;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * @Description: 任务表
 * @Author: jeecg-boot
 * @Date:   2024-09-05
 * @Version: V1.0
 */
public interface IWmTaskService extends IService<WmTask> {

	/**根节点父ID的值*/
	public static final String ROOT_PID_VALUE = "0";

	/**树节点有子节点状态值*/
	public static final String HASCHILD = "1";

	/**树节点无子节点状态值*/
	public static final String NOCHILD = "0";

	/**所有层级父节点值*/
	public static final String ANCESTORS = "0";

	/**
	 * 新增节点
	 *
	 * @param wmTask
	 */
	void addWmTask(WmTask wmTask);

	/**
	 * 修改节点
	 *
	 * @param wmTask
	 * @throws JeecgBootException
	 */
	void updateWmTask(WmTask wmTask) throws JeecgBootException;

	/**
	 * 删除节点
	 *
	 * @param id
	 * @throws JeecgBootException
	 */
	void deleteWmTask(String id) throws JeecgBootException;

	/**
	 * 查询所有数据，无分页
	 *
	 * @param queryWrapper
	 * @return List<WmTask>
	 */
	List<WmTask> queryTreeListNoPage(QueryWrapper<WmTask> queryWrapper);

	/**
	 * 【vue3专用】根据父级编码加载分类字典的数据
	 *
	 * @param parentCode
	 * @return
	 */
	List<SelectTreeModel> queryListByCode(String parentCode);

	/**
	 * 【vue3专用】根据pid查询子节点集合
	 *
	 * @param pid
	 * @return
	 */
	List<SelectTreeModel> queryListByPid(String pid);

	public String checkItemCodeUnique(WmTask wmTask);

	public String checkItemNameUnique(WmTask wmTask);

	/**
	 * 任务下是否有子任务
	 * @param id
	 * @return
	 */
	public boolean checkHasItem(String id);
	/**
	 * 导入组件BOM
	 * @param bomNode
	 * @param wmTaskParent
	 */
	public WmTask importComponentBom(BOMNode bomNode, WmTask wmTaskParent);

	/**
	 * 查询父任务
	 * @param code
	 * @param wmTaskbookId
	 */
	public WmTask selectTaskByCodeAndTaskbookId(String code, String wmTaskbookId);

	/**
	 * 查询父任务
	 * @param pCode
	 * @param wmTaskRoot
	 */
	public WmTask selectTaskByCodeAndTaskParent(String pCode, WmTask wmTaskRoot);

	/**
	 * 转换任务书
	 */
	public Map<String, Object> transferTaskbook(WmTaskbook wmTaskbookOld, WmTaskbook wmTaskbookNew, WmTaskbookFlow wmTaskbookFlow);

    /**
     * 获取任务子集(树形)
     */
    public List<WmTask> selectTaskChildrenInIdList(WmTask wmTaskParent, List<String> taskIdList);

	/**
	 * 获取任务子集(列表，不包括自己)
	 */
	public List<WmTask> selectChildTaskList(WmTask wmTaskParent);

	/**
	 * 通过叶子节点获取祖先（最祖先）任务列表
	 */
	public List<WmTask> selectAncestorTaskList(List<WmTask> wmTaskList, List<String> contractProductIdList);

	/**
	 * 通过叶子节点获取祖先任务列表
	 */
	public List<WmTask> selectAncestorTaskList(List<WmTask> wmTaskList);

	/**
	 * 查询任务及其子任务(树形图)
	 */
	public WmTask selectTreeChildrenWithTask(WmTask wmTask);

	/**
	 * 通过任务书ID查询根节点任务
	 */
	public WmTask getRootTaskByWmTaskbookId(String wmTaskbookId);

	/**
	 * 通过任务书ID查询根节点任务
	 */
	public WmTask getRootTaskByWmTaskbookIdAndVersion(String wmTaskbookId, String version);

	/**
	 * 查询任务下面可以展开的节点列表
	 */
	public List<String> getExpandKeys(WmTask wmTask);

	/**
	 * 获取所有子任务，返回到一个列表
	 */
	public List<WmTask> getChildrenAsOneList(WmTask wmTask);

	/**
	 * 通过合同产品查询根任务
	 */
	public List<WmTask> selectRootTaskByContractProduct(List<String> wmContractProductList);

	/**
	 * 通过合同产品查询根任务（生产任务书为设计起点任务，其他类型为根任务）
	 */
	public List<WmTask> selectStatisticTaskByContractProduct(List<String> wmContractProductList);

	/**
	 * 通过合同产品查询留存任务（生产任务书为设计起点任务，其他类型为根任务）
	 */
	public List<WmTask> selectRemainTaskByContractProduct(List<String> wmContractProductList);

	/**
	 * 根据合同产品列表获取统计数量
	 */
	public WmProjectStatisticVo getStatisticByContractProduct(List<String> wmContractProductList);

	/**
	 * 通过合同产品查询用时排行根任务
	 */
	public List<WmTask> selectRemainTaskRankByContractProduct(List<String> wmContractProductList);

	/**
	 * 通过合同产品查询所有任务
	 */
	public List<WmTask> selectTaskByContractProduct(List<String> wmContractProductList);

	/**
	 * 通过合同产品查询生产任务
	 */
	public List<WmTask> selectSendUnitTask(List<String> wmContractProductList, String firstDayOfMonth, String lastDayOfMonth);

	/**
	 * 通过合同产品查询采购任务
	 */
	public List<WmTask> selectPurchaseTask(List<String> wmContractProductList);

	/**
	 * 获取部门留存任务列表
	 * @param buId
	 * @param contractProductIdList
	 * @param buDepartList
	 */
	public List<WmDepartRemainTaskVo> remainList(String buId, List<String> contractProductIdList, List<String> buDepartList);

	/**
	 * 判断生产任务书下任务是否设置了发货单位
	 */
	public Boolean produceTaskHasSendUnit(String wmTaskbookId);

	/**
	 * 通过合同产品查询生产任务(设计起点任务)
	 */
	public List<WmProductRecpt> selectStartPointTask(List<String> wmContractProductList, String firstDayOfMonth, String lastDayOfMonth);

	/**
	 * 通过合同产品查询外协生产任务
	 */
	public List<WmOutSource> selectOutSourceTask(List<String> wmContractProductList, String firstDayOfMonth, String lastDayOfMonth);

	/**
	 * 通过合同产品查询调试生产任务
	 */
	public List<WmProductDebug> selectInstallDebugTask(List<String> wmContractProductList, String firstDayOfMonth, String lastDayOfMonth);

	/**
	 * 获取同级的任务列表
	 */
	public List<WmTask> sameLevelTask(WmTask wmTask);

	/**
	 * 获取同一任务书下设计起点任务列表
	 */
	public List<WmTask> startPointTask(String wmTaskbookId);

	/**
	 * 获取父级的任务列表
	 */
	public List<WmTask> ancestorTask(WmTask wmTask);

	/**
	 * 通过关键字搜索
	 */
	public List<WmTask> searchByName(String searchKey);

	/**
	 * 查询任务的子任务，直到有发货单位任务为止
	 */
	public List<WmTask> selectTaskChildrenUntilSendUnit(WmTask wmTask);

	/**
	 * 查询设计任务ID列表
	 * @param taskbookType
	 * @param status
	 * @param contractProductIdList
	 * @return
	 */
	public List<WmTask> selectTaskIdOfDesignList(String taskbookType, String status, List<String> contractProductIdList);

	/**
	 * 查询调试任务ID列表
	 * @param contractProductIdList
	 * @return
	 */
	public List<WmTask> selectTaskOfDebugList(List<String> contractProductIdList);

	/**
	 * 查询工艺任务ID列表
	 * @param taskbookType
	 * @param status
	 * @param contractProductIdList
	 * @return
	 */
	public List<WmTask> selectTaskOfProcessList(String taskbookType, String status, List<String> contractProductIdList);

	/**
	 * 通过任务书ID查询工艺是否设计提交
	 */
	public Boolean isProcessSubmit(String wmTaskbookId);

	/**
	 * 查询工程任务ID列表
	 * @param contractProductIdList
	 * @return
	 */
	public List<WmTask> selectTaskOfEngineerList(List<String> contractProductIdList);

	/**
	 * 获取应发清单列表
	 * @param contractProductIdList
	 */
	public List<WmTask> shouldSendList(List<String> contractProductIdList);

	/**
	 * 获取子制产品发货清单列表
	 * @param contractProductIdList
	 */
	public List<WmTask> produceProduceSendList(List<String> contractProductIdList);

	/**
	 * 获取外购材料发货清单列表
	 * @param contractProductIdList
	 */
	public List<WmTask> purchaseMaterialSendList(List<String> contractProductIdList);

	/**
	 * 获取外购件发货清单列表
	 * @param contractProductIdList
	 */
	public List<WmTask> purchaseProductSendList(List<String> contractProductIdList);

	/**
	 * 通过合同产品查询所有任务
	 */
	public List<WmTask> listByContractProductList(List<WmContractProduct> wmContractProductList);

	/**
	 * 删除任务书任务
	 */
	public void deleteByTaskbookId(String wmTaskbookId);

	/**
	 * 新增节点
	 *
	 * @param wmTask
	 */
	public void addWmTaskByVersion(WmTask wmTask);

	/**
	 * 提交技改
	 * @param wmTaskOfDesign
	 * @param wmTaskbookOfProduce
	 */
	public List<WmTask> submitSkillChange(WmTask wmTaskOfDesign, WmTaskbook wmTaskbookOfProduce);
}
